#ifndef _UTIL_H_ //防止重复包含 如果已经定义则不会展开
#define _UTIL_H_

/*实用类-提供一些常用的小接口
* 1.获取系统时间
* 2.判断⽂件是否存在
* 3.获取⽂件的所在⽬录路径
* 4.创建⽬录
*/

#include <iostream>
#include <string>
#include <ctime>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

namespace Log
{
    namespace LogUtil
    {
        class Date
        {
        public:
            //获取时间(戳)
            static time_t now() { return time(nullptr); }
        };

        class File
        {
        public:
            //查询文件是否存在
            static bool exists(const std::string& filename)
            {
                //stat是POSIX标准接口 可移植和跨平台
                struct stat st;
                return (stat(filename.c_str(),&st) == 0);
            }
            //查询文件路径
            static std::string path(const std::string& filename)
            {
                //Liunx文件目录以 / 分割  而 Windows以 \ 分割
                auto pos = filename.find_last_of("/\\"); //查找 \或/ 只要查找到了就返回 满足跨平台 从后往前找
                if(pos == std::string::npos) return "."; //不存在分隔符 则表示文件在当前路径
                return filename.substr(0,pos+1); //去掉文件名 剩下的就是路径(文件路径不包括文件自己)
            }
            //创建目录
            static void createDirectory(const std::string& filename)
            {
                //./abc/123/456 创建目录肯定从某一个目录开始 先创建abc目录再创建123目录再创建456目录

                // '/'('\')位置
                size_t pos = 0;
                // 查找的起始位置
                size_t idx = 0;

                int n = filename.size();
                //创建目录的顺序
                // ./abc
                // ./abc/123
                // ./abc/123/456
                //每次先创建父级目录 再创建后面的目录
                //所以创建目录的路径会一步一步变长
                while(idx < n)
                {
                    pos = filename.find_first_of("/\\",idx);
                    if(pos == std::string::npos)
                    {
                        //如果找不到路径分隔符 则直接创建即可
                        mkdir(filename.c_str(),0777);
                        break;
                    }
                    //寻找父级路径 从寻找的起始位置开始 截取父级目录名(包括路径分隔符)
                    //每次截取 不能只截取当前目录的名称 还需要前面的目录名称组成具体路径 而不是相对路径
                    //从0截取到pos+1位置 获得当前路径的绝对路径
                    std::string parten_path = filename.substr(0,pos + 1);
                    //如果父级路径已经存在 则更新查找的下一个起始位置 继续查找
                    if(exists(parten_path)) { idx = pos+1; continue; }
                    mkdir(parten_path.c_str(),0777);
                    idx = pos+1;
                }
            }
        };
    }
}
#endif